﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using Jc.MicroDesigner.Management;
using System.Drawing.Design;

namespace Jc.MicroDesigner.ToolWindows
{
    /// <summary>
    /// Служебный класс для отображения настроек
    /// </summary>
    public class StartOptions
    {
        private sbyte _StartSignal = 0;
        private UInt16 _TactTime = 8;

        /// <summary>
        /// Количество тактов для запуска
        /// </summary>
        [Category("Параметры запуска")]
        [Description("Количество тактов выполнения")]
        [DisplayName("Количество Тактов")]
        public UInt16 TactCount
        {
            get;
            set;
        }

        /// <summary>
        /// Длительность одного такта, нс
        /// </summary>
        [Category("Параметры запуска")]
        [Description("Длительность одного такта, нс")]
        [DisplayName("Длительность Такта")]
        public UInt16 TactTime
        {
            get { return _TactTime; }
            set
            {
                _TactTime = (UInt16)(value % ObjectManager.MaxTactTime);
            }
        }

        /// <summary>
        /// Начальный сигнал ТТЛ логики
        /// </summary>
        [Category("Параметры запуска")]
        [Description("Начальный сигнал ТТЛ логики")]
        [DisplayName("Сигнал инициализации")]
        public sbyte StartSignal
        {
            get { return _StartSignal; }
            set
            {
                if (value == 0 || value == 1)
                    _StartSignal = value;
                else
                    _StartSignal = 0;
            }
        }

        /// <summary>
        /// Ширина сигнала длительностью 1 нс
        /// </summary>
        [Category("Построение диаграммы")]
        [Description("Ширина сигнала длительностью 1 нс")]
        [DisplayName("Масштаб сигнала")]
        public UInt16 SignalWidth
        {
            get;
            set;
        }

        /// <summary>
        /// Отображать метки времени
        /// True - да, False - Нет
        /// </summary>
        [Category("Построение диаграммы")]
        [Description("Отображать метки времени")]
        [DefaultValue(true)]
        [DisplayName("Метки времени")]
        [TypeConverter(typeof(BooleanTypeConverter))]
        public bool ViewTime
        {
            get;
            set;
        }

        /// <summary>
        /// Интервалы в нс, через которые проставлять метки времени на диаграмме
        /// </summary>
        [Category("Построение диаграммы")]
        [Description("Интервалы в нс, через которые проставлять метки времени на диаграмме")]
        [DisplayName("Интервалы меток")]
        public UInt16 TimeInterval
        {
            get;
            set;
        }

        /// <summary>
        /// Отображать сетку времени
        /// True - да, False - нет
        /// </summary>
        [Category("Построение диаграммы")]
        [Description("Отображать сетку времени")]
        [DefaultValue(true)]
        [DisplayName("Сетка времени")]
        [TypeConverter(typeof(BooleanTypeConverter))]
        public bool ViewGrid
        {
            get;
            set;
        }

        /// <summary>
        /// Вызывает форму редактирования генераторов
        /// </summary>
        [Category("Исходные данные")]
        [Description("Редактор генераторов и сигналов")]
        [DisplayName("Генераторы")]
        [TypeConverter(typeof(CustomPropertyConverter))]
        [Editor(typeof(CustomPropertyEditor), typeof(UITypeEditor))]
        public CustomPropertyField Patterns
        {
            get;
            set;
        }

        /// <summary>
        /// Вызывает форму редактирования наблюдений
        /// </summary>
        [Category("Исходные данные")]
        [Description("Редактор наблюдаемых элементов")]
        [DisplayName("Список наблюдения")]
        [TypeConverter(typeof(CustomPropertyConverter))]
        [Editor(typeof(CustomPropertyEditor), typeof(UITypeEditor))]
        public CustomPropertyField Watches
        {
            get;
            set;
        }

        /// <summary>
        /// Вызывает форму редактирования импульсных генераторов
        /// </summary>
        [Category("Исходные данные")]
        [Description("Редактор генераторов импульсов")]
        [DisplayName("Генераторы импульсов")]
        [TypeConverter(typeof(CustomPropertyConverter))]
        [Editor(typeof(CustomPropertyEditor), typeof(UITypeEditor))]
        public CustomPropertyField Clocks
        {
            get;
            set;
        }

        private StartOptions()
        {
            TactCount = 64;
            TactTime = 8;
            SignalWidth = 10;
            ViewTime = true;
            ViewGrid = true;
            TimeInterval = 10;
            StartSignal = 0;

            Patterns = new CustomPropertyField();
            Patterns._FormType = typeof(SignalsEditorForm);
            Patterns._Title = "< Сигналы >";

            Watches = new CustomPropertyField();
            Watches._FormType = typeof(WatchListForm);
            Watches._Title = "< Наблюдения >";

            Clocks = new CustomPropertyField();
            Clocks._FormType = typeof(ClockEditor);
            Clocks._Title = "< Импульсы >";
        }

        private static StartOptions _Instance = new StartOptions();

        /// <summary>
        /// Опции запуска
        /// Сохраняются только на время работы программы
        /// </summary>
        public static StartOptions Options
        {
            get
            {
                return _Instance;
            }
        }

        /// <summary>
        /// Логическая схема
        /// </summary>
        [Browsable(false)]
        public ObjectManager Manager
        {
            set
            {
                Patterns._Manager = value;
                Watches._Manager = value;
                Clocks._Manager = value;
            }
        }
    }
}